// const MonacoEditorPlugin = require('monaco-editor-webpack-plugin')
const path = require('path')
const resolve = dir => path.join(__dirname, dir)
const TerserPlugin = require('terser-webpack-plugin')

module.exports = {
  runtimeCompiler: true,
  configureWebpack: config => {
    if (process.env.NODE_ENV === 'production') {
      config.optimization.minimizer = [
        new TerserPlugin({
          // 取消sourceMap
          sourceMap: true,
          // 并行执行
          parallel: true,
          // 剥离注释
          extractComments: 'all',
          // 开启代码压缩
          terserOptions: {
            compress: true
          }
        })
      ]
      config.optimization.splitChunks = {
        chunks: 'all',
        // 每个分包最小100KB，低于该大小的就没有必要分包了
        minSize: 1024 * 100
      }
    } else {
      config.devtool = 'inline-source-map'
    }
  },
  chainWebpack: config => {
    if (process.env.NODE_ENV === 'analyzer') {
      // 在分析环境下、配置包分析器
      config.plugin('webpack-bundle-analyzer').use(require('webpack-bundle-analyzer').BundleAnalyzerPlugin)
    }

    const svgIconsDirectory = resolve('assets/icons')
    // svg rule loader
    const svgRule = config.module.rule('svg') // 找到svg-loader
    svgRule.uses.clear() // 清除已有的loader, 如果不这样做会添加在此loader之后
    svgRule.exclude.add(/node_modules/) // 正则匹配排除node_modules目录
    svgRule // 添加svg新的loader处理
      .test(/\.svg$/)
      .use('svg-sprite-loader')
      .loader('svg-sprite-loader')
      .options({
        symbolId: 'icon-[name]'
      })
    svgRule.include.add(svgIconsDirectory)
    // 修改images loader 添加svg处理
    const imagesRule = config.module.rule('images')
    imagesRule.exclude.add(svgIconsDirectory)
    config.module.rule('images').test(/\.(png|jpe?g|gif|svg)(\?.*)?$/)

    const jsRule = config.module.rule('js') // js-rule
    jsRule.exclude.add(/dhtmlxgantt/) // 排除gantt图目录

    const eslint = config.module.rule('eslint') // eslint
    eslint.exclude.add(/dhtmlxgantt/) // 排除gantt图目录
  },
  css: {
    loaderOptions: {
      less: {
        javascriptEnabled: true
      }
    }
  }
}
